import { login, getUserInfo, getUserDetailById } from '@/api/user'
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { resetRouter } from '@/router'

const getDefaultState = () => {
  return {
    token: getToken() || null,
    userInfo: null,
  }
}

const state = getDefaultState()

const mutations = {
  /*   RESET_STATE: (state) => {
      Object.assign(state, getDefaultState())
    }, */
  // 设置token
  setToken(state, token) {
    state.token = token // 设置token  只是修改state的数据  123 =》 1234
    setToken(token)// vuex和 缓存数据的同步
  },
  // 设置用户信息
  setUserInfo(state, userInfo) {
    // 用 浅拷贝的方式去赋值对象 因为这样数据更新之后，才会触发组件的更新
    state.userInfo = { ...userInfo }
  },
  // 删除用户信息
  reomveUserInfo(state) {
    state.userInfo = null
  }

}

const actions = {
  // user login
  // 定义login action  也需要参数 调用action时 传递过来的参数
  async login({ commit }, data) {
    const result = await login(data)
    // axios默认给数据加了一层data
    // 表示登录接口调用成功 也就是意味着你的用户名和密码是正确的
    // 现在有用户token
    // actions 修改state 必须通过mutations
    commit('setToken', result)
    // 写入时间戳
    setTimeStamp() // 将当前的最新时间写入缓存
  },

  // get user info
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getUserInfo().then(baseInfo => {
        if (!baseInfo) {
          return reject('Verification failed, please Login again.')
        }
        getUserDetailById(baseInfo.userId).then(baseResult => {
          const result = { ...baseInfo, ...baseResult }
          // set user info to vuex
          commit('setUserInfo', result)
          resolve(result)
        }).catch((error) => {
          reject(error)
        })
      }).catch(error => {
        reject(error)
      })
    })
  },

  // user logout
  logout({ commit }) {
    // removeToken()
    commit('setToken', null)// must remove  token  first
    commit('reomveUserInfo', null)// delete userInfo
    // 重置路由
    resetRouter()
    // 还有一步  vuex中的数据是不是还在
    // 要清空permission模块下的state数据
    // vuex中 user子模块  permission子模块
    // 子模块调用子模块的action  默认情况下 子模块的context是子模块的
    // 父模块 调用 子模块的action
    commit('permission/setRoutes', [], { root: true })
    // 子模块调用子模块的action 可以 将 commit的第三个参数 设置成  { root: true } 就表示当前的context不是子模块了 而是父模块
  },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      removeToken() // must remove  token  first
      commit('setToken', null)
      resolve()
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

